package com.itheima.reggie.controller;

import com.itheima.reggie.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.UUID;

@RestController
@Slf4j
@RequestMapping("/common")
public class CommonController {
    //去配置文件中 找到路径变量赋值
    @Value("${reggie.path}")
    private String basePath;
    /**
     * 实现文件上传处理
     * 1:在yml中定义全局变量位置,此为固定位置了;
     */
    @PostMapping("/upload")
    public R<String>upload(MultipartFile file){
        log.info("我们看一下...."+file);
        //获取上传文件的原始名字 file.getOriginalFilename
        String filename = file.getOriginalFilename();
        log.info("文件名字::::"+filename);
        //获取文件后缀名,   用.最后索引截取  把.jpg截取出来.
        String fileHouZhui = filename.substring(filename.lastIndexOf("."));
        //将图片存到服务器中,运用图片名字随机处理
        String fileName= UUID.randomUUID().toString()+ fileHouZhui;
        //把文件的基本目录进行封装,判断它是否存在
        File dir = new File(basePath);
        //.exists判断它是否存在
        if (!dir.exists()){//不存在
            dir.mkdirs();
        }
        //我们指定服务器,当前要存储文件的路径
        File uploadFile = new File(dir, fileName);
        //这个新文件的数据来自上传的数据  MultiparFile file
        //按照以前边读边写
        try {
            file.transferTo(uploadFile);  //把上传的文件转换到新文件中
                                          //底层使 copy
            return R.success(fileName); //因为前端要文件名,所以这里返回 fileName
        } catch (IOException e) {
            e.printStackTrace();

        }
        return R.error("程序上传过程中遇到问题了");
    }
    @GetMapping("/download")
    public void download(String name, HttpServletResponse response){
        log.info("文件进行下载,下载的文件名name:",name);
        //先读后写
        //要读的文件在哪里?   在basepath下的name文件
        try{
            File file = new File(basePath,name);
            // 这个要下载的文件是不是需要 字节输入流去读? 需要
            FileInputStream in = new FileInputStream(file);
            //读到的数据写哪里 写到 response字节输出流
            ServletOutputStream out = response.getOutputStream();
            //告知浏览器打开形式  设置响应数据类型
            response.setContentType("image/ipeg");
            //边读边写
            int len = 0;
            byte[] buffer = new byte[8*1024];
            while(((len=in.read(buffer))!=-1)){
                //写出去
                out.write(buffer,0,len);//读多少写多少
            }
            //释放资源
            out.close();//写不写都行 因为  response对象会自动管理
            in.close();
        }catch (IOException e){
           // e.printStackTrace();
        }

    }
}
